<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Style-Type" content="text/css">
  <script src='../bbs.js'></script>

  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-120820034-1"></script>

  <link href="../bbs.css" type="text/css" rel="stylesheet">
  <link rel="shortcut icon" href="/favicon.ico">
  <title>コメントアウトマクロ | サクラエディタ過去ログ</title>
</head>
<body>
<ul class="side">
        <a href="./" class="toindex">◀マクロトップへ</a>
        <li><div class="list-title">
    <span class="no">593</span>
    <a class="thread-title" href="593.html#593">コメントアウトマクロ</a></div>
    </li>
    </ul><ul class="main"><li><section><h1 id=593>
    <span class="no">[593]</span>
    <a class="thread-title" href="#593">コメントアウトマクロ</a>
    <span class="author">sakana</span>
    <time datetime="2015-08-10T02:17:02">2015年08月10日 02:17</time></h1>
    <div class="body">コードの後ろのコメントを解除しない,<br>処理を一度でUndoできるマクロです。<br>[591]phodra氏のコメントマクロを参考にさせていただきました。<br><br>-----------------------------------<br>CommentAdd.js<br>-----------------------------------<br>var CmtLen;<br>var CmtStr;<br>main();<br><br>function main(){<br>    // エディタがビューモード(読み取り専用)なら終了。<br>    //if ( Editor.ExpandParameter("${R?r$:$:$}") == "r") return;<br>    // 拡張子別にコメントステートメントを定義<br>    var comment = new Array();<br>    comment["cpp"]  = "//"; comment["c"]    = "//"; comment["h"]    = "//";<br>    comment["js"]   = "//"; comment["java"] = "//";<br>    comment["php"]  = "//"; comment["uws"]  = "//";<br>    comment["mac"]  = "//"; comment["ppa"]  = "//";<br>    comment["vbs"]  = "'";  comment["bas"]  = "'";  comment["frm"]  = "'";<br>    comment["cls"]  = "'";  comment["vb"]   = "'";<br>    comment["cgi"]  = "#";  comment["pl"]   = "#";  comment["pm"]   = "#";<br>    comment["asm"]  = ";";  comment["ini"]  = ";";  comment["inf"]  = ";";<br>    comment["cnf"]  = ";";  comment["conf"] = ";";<br>    comment["tex"]  = "%";<br>    comment["cmd"]  = "REM ";<br>    comment["bat"]  = "REM ";<br>    comment["txt"]  = "　"; comment["noext"] = "　";<br><br>    // ちらつき防止<br>    Editor.SetDrawSwitch(0);<br><br>    //拡張子を切り出し<br>    var fname = Editor.ExpandParameter("$f");<br>    var ext = fname.substring( fname.lastIndexOf(".") + 1);<br>    ext = ext==fname? "noext": ext.toLowerCase();<br><br>    // 登録されていない拡張子であれば終了。<br>    if( comment[ext] == null ){<br>        Editor.InfoMsg("マクロ未登録拡張子です。");<br>        return;<br>    }<br><br>    CmtStr = comment[ext];<br>    CmtLen = CmtStr.length;<br> <br>    Editor.AddRefUndoBuffer(); // これ以降、Undoバッファをまとめる<br><br>    switch(Editor.IsTextSelected()) {<br>        // 非選択状態<br>        case 0:<br>            // ロジック座標を取得<br>            //  選択範囲がないのでレイアウトから変換する必要はない<br>            var l = parseInt(Editor.ExpandParameter("$y"));<br>            var c = parseInt(Editor.ExpandParameter("$x"));<br> <br>            Editor.MoveCursor( l, 1, 0);<br>            Editor.InsText(CmtStr);<br>            Editor.MoveCursor( l, (c+CmtLen), 0);<br>        break;<br> <br>        // 選択状態<br>        case 1:<br><br>            //選択論理行の取得<br>            var lay_fl = Editor.GetSelectLineFrom();<br>            var lay_tl = Editor.GetSelectLineTo();<br>            var fl = Editor.LayoutToLogicLineNum( lay_fl );<br>            var tl = Editor.LayoutToLogicLineNum( lay_tl );<br> <br>            for(var i = fl; i &lt;= tl; i++){<br>                Editor.Jump(i,1);<br>                Editor.InsText(CmtStr);<br>            }<br>            // 選択範囲を復元（行だけ）<br>            Editor.GoLineEnd();<br>            Editor.MoveCursor( fl, 1, 1);<br> <br>        break;<br>        // ブロック選択状態<br>        case 2:<br><br>        break;<br>        default:<br>            /* ignore */<br>        break;<br>    }<br> <br>    Editor.SetUndoBuffer(); // ここでまとめてUndoバッファのリストに登録される<br><br>    // 描画フラグを戻してから再描画<br>    Editor.SetDrawSwitch(1);<br>    Editor.ReDraw(0);<br>}<br><br>-----------------------------------<br>CommentRemove.js<br>-----------------------------------<br>var S_Buf = "dummy";<br>var CmtLen;<br>var CmtStr;<br><br>//Editor.InfoMsg(S_Buf);<br>main();<br><br>function main(){<br>    var i;<br>    // エディタがビューモード(読み取り専用)なら終了。<br>    //if ( Editor.ExpandParameter("${R?r$:$:$}") == "r") return;<br>    // 拡張子別にコメントステートメントを定義<br>    var comment = new Array();<br>    comment["cpp"]  = "//"; comment["c"]    = "//"; comment["h"]    = "//";<br>    comment["js"]   = "//"; comment["java"] = "//";<br>    comment["php"]  = "//"; comment["uws"]  = "//";<br>    comment["mac"]  = "//"; comment["ppa"]  = "//";<br>    comment["vbs"]  = "'";  comment["bas"]  = "'";  comment["frm"]  = "'";<br>    comment["cls"]  = "'";  comment["vb"]   = "'";<br>    comment["cgi"]  = "#";  comment["pl"]   = "#";  comment["pm"]   = "#";<br>    comment["asm"]  = ";";  comment["ini"]  = ";";  comment["inf"]  = ";";<br>    comment["cnf"]  = ";";  comment["conf"] = ";";<br>    comment["tex"]  = "%";<br>    comment["cmd"]  = "REM ";<br>    comment["bat"]  = "REM ";<br>// このマクロはスペースはコメントと見做せない&#9;comment["txt"]  = "　"; comment["noext"] = "　";<br><br>     // ちらつき防止<br>    Editor.SetDrawSwitch(0);<br><br>    //拡張子を切り出し<br>    var fname = Editor.ExpandParameter("$f");<br>    var ext = fname.substring( fname.lastIndexOf(".") + 1);<br>    ext = ext==fname? "noext": ext.toLowerCase();<br> <br>    // 登録されていない拡張子であれば終了。<br>    if( comment[ext] == null ){<br>    &#9;Editor.InfoMsg("マクロ未登録拡張子です。");<br>    &#9;return;<br>    }<br><br>    CmtStr = comment[ext];<br>    CmtLen = CmtStr.length;<br> <br>    Editor.AddRefUndoBuffer(); // これ以降、Undoバッファをまとめる<br><br>    switch(Editor.IsTextSelected()) {<br>        // 非選択状態<br>        case 0:<br>            // ロジック座標を取得<br>            //  選択範囲がないのでレイアウトから変換する必要はない<br>            var l = parseInt(Editor.ExpandParameter("$y"));<br>            var c = parseInt(Editor.ExpandParameter("$x"));<br> <br>            var cmtPos = LineCmtDel(l);<br> <br>            if((c&gt;cmtPos)&amp;&amp;(cmtPos==0)){<br>                if(c&gt;(cmtPos + CmtLen)){<br>                    c = c - CmtLen;<br>                }else{<br>                    c = cmtPos;<br>                }<br>            }<br> <br>            Editor.MoveCursor( l, c, 0);<br>            break;<br>        // 選択状態<br>        case 1:<br>            var lay_fl = Editor.GetSelectLineFrom();<br>            var lay_tl = Editor.GetSelectLineTo();<br>            // レイアウト座標をロジック座標に変換<br>            //  選択位置のロジック座標を取得する関数はない？<br>            var fl = Editor.LayoutToLogicLineNum( lay_fl );<br>            var tl = Editor.LayoutToLogicLineNum( lay_tl );<br> <br>            for(i = fl; i &lt;= tl; i++){<br>                LineCmtDel(i);<br>            }<br> <br>            // 選択範囲を復元（行だけ）<br>            Editor.GoLineEnd();<br>            Editor.MoveCursor( fl, 1, 1);<br> <br>        break;<br>        // ブロック選択状態<br>        case 2:<br><br>        break;<br>        default:<br>            /* ignore */<br>        break;<br>    }<br><br>    Editor.SetUndoBuffer(); // ここでまとめてUndoバッファのリストに登録される<br><br>    // 描画フラグを戻してから再描画<br>    Editor.SetDrawSwitch(1);<br>    Editor.ReDraw(0);<br>}<br><br>function LineCmtDel(l_no){<br>    var nUnSpace;<br> <br>    Editor.Jump(l_no,1);<br>    S_Buf = Editor.GetLineStr(l_no);<br>    nUnSpace = S_Buf.search(/[^\s]/);<br> <br>    if(nUnSpace &gt;= 0){<br>        S_Buf = S_Buf.substr(nUnSpace,CmtLen); // nUnSpaceからコメント文字数分取得<br>    }<br> <br>    if(S_Buf == CmtStr){<br>        Editor.MoveCursor(l_no,nUnSpace+1,0);<br>        for(var i=0;i&lt;CmtLen;i++){<br>            Editor.Delete();<br>        }<br>        return nUnSpace;<br>    }<br>    return 0;<br>}<br></div></section>
    </li></ul></body></html>